const { UserModel } = require('../../models/index')
const passwordUtils = require('../../utils/passwordUtils')

// 腾讯云存储相关服务
const COS = require('cos-nodejs-sdk-v5')
// 临时使用内存存储图片
const multer = require('multer')
const path = require('path')

// 生成随机ID
const { v4: uuidV4 } = require('uuid')

// 初始化 COS SDK  
const cos = new COS({
  SecretId: 'AKIDMxSo2GVoDi9UfeRfnjZCcpoV6f5Qc8Vf',
  SecretKey: '1oNipiMwX8dEakgOt9IWdWBdrrdBVP5X',
})

// 配置 multer 存储引擎，这里我们使用内存存储作为临时存储  
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

// 提交用户个人信息
const submitUserInfo = async (req, res) => {
  try {
    // 个人信息为空的情况
    if (!req.body) {
      return res.status(400).json({ error: '个人信息不能为空！' })
    }

    // 使用正则表达式验证手机号和邮箱
    const phoneRegex = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/
    const emailRegex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    if (!phoneRegex.test(req.body.phone)) {
      throw new Error('请输入正确的手机号码')
    }
    if (!emailRegex.test(req.body.email)) {
      throw new Error('请输入正确的电子邮箱')
    }

    //  根据用户ID找到用户记录
    const user = await UserModel.findByPk(req.body.id)
    if (!user) {
      return res.status(404).json({ error: '用户不存在！' })
    }

    // 更新用户记录中的手机号和邮箱
    const updateUser = await user.update({
      phone: req.body.phone,
      email: req.body.email,
      avatar: req.body.avatar
    })

    const updateResponse = {
      phone: updateUser.phone,
      email: updateUser.email,
      avatar: updateUser.avatar
    }

    // 更新成功的响应
    res.status(200).json({
      title: '更新成功',
      message: updateResponse
    })


  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 获取用户个人信息
const getUserInfo = async (req, res) => {
  try {
    const id = req.params.id

    // 用户ID不存在的情况
    if (!id || isNaN(parseInt(id, 10))) {
      return res.status(400).json({ error: '无效的用户ID' })
    }

    // 查找用户信息记录
    const UserInfo = await UserModel.findByPk(id)

    // 没有找到用户记录的情况
    if (!UserInfo) {
      return res.status(404).json({ error: '用户不存在，请重新注册登录！' })
    }

    // 返回用户个人信息查找成功时的响应
    res.status(200).json({
      title: '查询成功',
      data: {
        id: UserInfo.id,
        username: UserInfo.username,
        phone: UserInfo.phone,
        email: UserInfo.email,
        avatar: UserInfo.avatar
      }
    })
  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 修改用户密码
const changeUserPwd = async (req, res) => {
  try {
    // 获取用户ID
    const id = req.params.id

    // 用户ID不存在的情况
    if (!id || isNaN(parseInt(id, 10))) {
      return res.status(400).json({ error: '无效的管理员ID' })
    }

    // 根据用户ID查找相关信息
    const UserInfo = await UserModel.findByPk(id)

    // 没有找到用户记录的情况
    if (!UserInfo) {
      return res.status(404).json({ error: '管理员不存在，请重新注册登录！' })
    }

    // 从请求体里获取旧密码和新密码
    const { oldPassword, newPassword } = req.body

    // 检查是否提供了旧密码和新密码
    if (!oldPassword || !newPassword) {
      return res.status(400).json({ error: '请提供旧密码和新密码！' })
    }

    // 新旧密码一致的情况
    if (oldPassword === newPassword) {
      return res.status(400).json({ error: '旧密码和新密码不能一致！' })
    }

    // 使用正则表达式验证输入的密码
    const passwordRegex = /^\S{6,15}$/  //匹配6-15位非空白字符
    if (!passwordRegex.test(oldPassword) || !passwordRegex.test(newPassword)) {
      throw new Error('密码必须是6-15位的非空字符')
    }

    // 验证旧密码是否正确
    const isMatch = await passwordUtils.checkPassword(oldPassword, UserInfo.password)
    if (!isMatch) {
      return res.status(400).json({ error: '旧密码不正确！' })
    }

    // 处理加密输入的新密码
    const hashNewPassword = await passwordUtils.hashPassword(newPassword)

    // 更新密码
    const updateUserPassword = await UserModel.update({ password: hashNewPassword }, {
      where: {
        id: id
      }
    })

    // 密码修改成功的响应
    res.status(200).json({
      title: '修改成功',
      message: '修改用户密码成功！'
    })
  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 上传用户头像
const uploadUserAvatar = (req, res) => {
  const Region = 'ap-beijing'

  try {
    // 封装multer的处理为一个Promise
    return new Promise((resolve, reject) => {
      // 使用 multer 的 single 方法处理名为 'file' 的文件上传字段  
      upload.single('file')(req, null, (err) => {
        if (err) {
          reject(err) //如果multer出错，直接拒绝Promise
        } else if (!req.file) {
          reject(new Error('没有选择文件上传')) //如果没有文件被上传，也需要拒绝Promise
        } else {
          resolve(req)  //如果成功，将req传递给下一个步骤
        }
      });
    }).then(async (req) => {
      // 文件信息  
      const file = req.file;

      // 使用UUID生成唯一的文件名
      const uuid = uuidV4()

      const originalExtension = path.extname(file.originalname)  //获取原始文件扩展名

      const fileNameWithUuid = `${uuid}${originalExtension}`; // 附加UUID到扩展名前
      console.log(fileNameWithUuid);

      const filePath = `avatar/user/${fileNameWithUuid}`; // 设置存储桶中的文件路径

      // 使用 COS SDK 上传文件  
      try {
        const data = await new Promise((resolve, reject) => {
          cos.putObject({
            Bucket: 'lejuhui-1327374532', // 替换为你的存储桶名称和APPID  
            Region: Region, // 替换为你的存储桶所在地域  
            Key: filePath, // 存储桶中的文件路径  
            Body: file.buffer, // 文件内容  
          }, (err, data) => {
            if (err) {
              reject(err);
            } else {
              resolve(data);
            }
          });
        });

        // 上传成功  
        // 这里可以获取文件的URL，但通常你需要根据COS的访问域名和文件路径拼接  
        const fileUrl = `https://lejuhui-1327374532.cos.${Region}.myqcloud.com/${filePath}`;
        res.status(200).json({
          title: '上传图片成功',
          url: fileUrl
        })
      } catch (error) {
        // 捕获COS上传时的错误
        res.status(500).json({
          error: '上传图片失败',
          message: error.message || '服务器内部错误'
        })
      }
    });
  } catch (error) {
    // 捕获所有可能发生的错误  
    console.error('上传房源图片时发生错误:', error);
    res.status(500).json({ error: error.message });
  }
}

module.exports = {
  submitUserInfo,
  getUserInfo,
  changeUserPwd,
  uploadUserAvatar
}